package design.factory;

/**
 * @author GY
 * @date 2019年1月20日
 * @说明: DefaultFactory
 */
public class HumanFactory1 implements IHumanFactory {
    /**
     * @author GY
     * @date 2019年1月20日
     * @说明: MAN、WOMAN
     */
    public static enum HumanType implements IHumanType {
        /**
         * 男人
         */
        MAN("MAN"),
        /**
         * 女人
         */
        WOMAN("WOMAN");
        private String name;
        private HumanType(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public static HumanType of(String name) {
            for (HumanType item : HumanType.values()) {
                if (item.getName().equals(name)) {
                    return item;
                }
            }
            throw new IllegalArgumentException("unkonwn HumanType: " + name);
        }
    }
    private HumanFactory1() {}
    private static class SingleHoler {// 私有静态内部类 保证效率、线程安全
        private static final HumanFactory1 HF = new HumanFactory1();
    }
    public static HumanFactory1 get() {
        return SingleHoler.HF; // 如果get有参数，那么使用静态内部类单例，是无法实现传参给HumanFactory1构造的
    }
    @Override
    public Human getHumanInstance(IHumanType type) {
        if(type.getClass() != HumanType.class)
            throw new RuntimeException("工厂与类型不匹配，请使用HumanFactory1.HumanType类型");
        if (type == HumanType.MAN)
            return new Menfolk();
        if (type == HumanType.WOMAN)
            return new Female();
        return null;
    }
}
